package com.autoerp.action.servico;

import java.util.List;

import org.mentawai.core.BaseAction;

import com.autoerp.dao.carro.CarroDAO;
import com.autoerp.dao.cliente.ClienteDAO;
import com.autoerp.dao.servico.OrdemServicoDAO;
import com.autoerp.dao.servico.PecaDAO;
import com.autoerp.model.carro.CarroEntity;
import com.autoerp.model.cliente.ClienteEntity;
import com.autoerp.model.servico.DemandaEntity;
import com.autoerp.model.servico.OrdemServicoEntity;
import com.autoerp.model.servico.PecaEntity;

/**
 * Classe representa a ação do modulo Servico/Ordem de Servico.
 */
public class OrdemServicoAction_OLD extends BaseAction {

	private final OrdemServicoDAO ordemServicoDAO;
	private final ClienteDAO clienteDAO;
	private final CarroDAO carroDAO;
	private final PecaDAO pecaDAO;

	private OrdemServicoEntity ordemServico = new OrdemServicoEntity();

	public OrdemServicoAction_OLD(OrdemServicoDAO ordemServicoDAO,
			ClienteDAO clienteDAO, CarroDAO carroDAO, PecaDAO pecaDAO) {
		this.ordemServicoDAO = ordemServicoDAO;
		this.clienteDAO = clienteDAO;
		this.carroDAO = carroDAO;
		this.pecaDAO = pecaDAO;
	}

	/**
	 * Action Adicionar Ordem de servico.
	 * 
	 * @return the string
	 */
	public String adicionar() {

		if (!isPost()) {

			// Retorna a String ERROR.
			return ERROR;

		} else {

			// Obter da entrada o identificador da cidade
			int id_cidade = input.getInt("id_cidade");

			// Instanciar o objeto cidade
			// CidadeEntity cidade = new CidadeEntity();

			// Setar o identificador cidade
			// cidade.setId_cidade(id_cidade);

			// Obter da entrada o objeto cliente
			ClienteEntity cliente = input.getObject(ClienteEntity.class);

			// Setar a cidade no objeto cliente
			// cliente.setCidade(cidade);

			// Salvar o cliente no BD
			clienteDAO.salvar(cliente);

			// Seta o objeto cliente na saida da action
			output.setObject(cliente);

			return CREATED;

		}

	}

	/**
	 * Action Buscar Cliente.
	 * 
	 * @return the string
	 */
	public String buscarCliente() {

		if (!isPost()) {
			// Retorna a String ERROR.
			return ERROR;

		} else {
			// Obter da entrada o identificador da opcao escolhida
			int id_busca = input.getInt("id_busca");

			// Obter da entrada o texto a ser buscado
			String de_busca = input.getString("de_busca");

			// Instanciar o objeto cliente
			ClienteEntity cliente = new ClienteEntity();

			// Instanciar lista de objeto cliente
			List<ClienteEntity> listaClientes = clienteDAO
					.buscarCliente(cliente);
			;

			// Fazer a busca pela opcao escolhida
			switch (id_busca) {

			// Buscar por nome
			case 01:

				// Setar nome buscado no objeto cliente
				cliente.setDe_nome(de_busca);

				// Busca cliente no BD
				listaClientes = clienteDAO.buscarCliente(cliente);

				// Se a lista de clientes for null ou vazia retorna null
				if (listaClientes == null || listaClientes.isEmpty()) {

					addMessage("Cliente não encontrado!");
					return ERROR;

				} else {
					// Setar clientes no output da action
					output.setValue("listaClientes", listaClientes);
					return SUCCESS;
				}

				// Buscar por ID
			case 02:

				// Setar id buscado no objeto cliente
				cliente.setId_cliente(Integer.parseInt(de_busca));

				// Busca cliente no BD
				listaClientes = clienteDAO.buscarCliente(cliente);

				// Se a lista de clientes for null ou vazia retorna null
				if (listaClientes == null || listaClientes.isEmpty()) {

					addMessage("Cliente não encontrado!");
					return ERROR;

				} else {
					// Setar clientes no output da action
					output.setValue("listaClientes", listaClientes);
					return SUCCESS;

				}

			default:
				return ERROR;

			}

		}

	}

	/**
	 * Action Nova Ordem de Servico.
	 * 
	 * @return the string
	 */
	public String novaOS() {

		// Obter da entrada o identificador do carro
		int id_carro = input.getInt("id_carro");

		// Obter da entrada o identificador do cliente
		int id_cliente = input.getInt("id_cliente");

		// Buscar cliente no BD
		ClienteEntity cliente = clienteDAO.buscarPorId(id_cliente);

		// Setar cliente na output da action
		output.setObject(cliente);

		// Instanciar objeto carro
		CarroEntity carro = new CarroEntity();

		// Carro não selecionado
		if (id_carro == 0) {

			// Setar cliente dono do carro
			carro.setCliente(cliente);

			// Instanciar lista de objeto carro
			List<CarroEntity> listaCarros = carroDAO.buscarCarro(carro);

			// Setar carros no output da action
			output.setValue("listaCarros", listaCarros);

			return SHOW;

			// Carro foi selecionado
		} else {

			// Buscar carro pelo seu identificador
			carro = carroDAO.buscarPorId(id_carro);

			// Setar o objeto carro na saida da action
			output.setObject(carro);

			// Setar o objeto cliente na saida da action
			output.setObject(cliente);
			
			// Setar carro na nova OS
			ordemServico.setCarro(carro);

			

			return SUCCESS;
		}

	}

	/**
	 * Action Editar Cliente.
	 * 
	 * @return the string
	 */
	public String editar() {

		if (!isPost()) {

			// Obter da entrada o identificador do cliente
			int id_cliente = input.getInt("id_cliente");

			// Buscar cliente no BD
			ClienteEntity cliente = clienteDAO.buscarPorId(id_cliente);

			// Setar cliente na output da action
			output.setObject(cliente);

			return SHOW;

		} else {

			// Obter da entrada o identificador do cliente
			int id = input.getInt("id_cliente");

			// Buscar cliente no BD
			ClienteEntity clienteNovo = clienteDAO.buscarPorId(id);

			input.inject(clienteNovo); // BlacklistParamFilter should be used
										// here
										// to project against malicious param
										// injection (see AppManager)
			// Update do cliente no BD
			clienteDAO.update(clienteNovo);

			replaceSessionObj(clienteNovo);

			addMessage("edit_ok");

			return UPDATED;
		}

	}

	/**
	 * Action Listar Clientes.
	 * 
	 * @return the string
	 */
	public String listarClientes() {
		// Instanciar lista de objeto cliente
		List<ClienteEntity> listaClientes = clienteDAO.buscarListaClientes();

		// Setar lista clientes no output da action
		output.setValue("listaClientes", listaClientes);

		return SUCCESS;

	}

	/**
	 * Action Listar Peças.
	 * 
	 * @return the string
	 */
	public String listarPecas() {
		// Instanciar lista de objeto peca
		List<PecaEntity> listaPecas = pecaDAO.buscarListaPecas();

		// Setar lista pecas no output da action via ajax
		ajax(listaPecas);

		return SUCCESS;

	}

	/**
	 * Action Exibir Peça.
	 * 
	 * @return the string
	 */
	public String exibirPeca() {

		// Obter da entrada o identificador da peça
		int id = input.getInt("id_peca");

		// Buscar peca no BD
		PecaEntity peca = pecaDAO.buscarPorId(id);

		// Setar pecas no output da action via ajax
		ajax(peca);

		return SUCCESS;

	}

	/**
	 * Action Adicionar Demanda Peça.
	 * 
	 * @return the string
	 */
	public String addDemandaPeca() {
		// Instanciar o objeto Demanda.
		DemandaEntity demandaPeca = new DemandaEntity();

		// Obter da entrada o identificador da peça
		int id_peca = input.getInt("id_peca");

		// Obter da entrada a quantidade de peça
		int nu_quat_pecas = input.getInt("nu_quat_pecas");
		
		//Obter da entrada o preço da peça
		float nu_preco = input.getFloat("nu_preco");

		// Buscar peca no BD
		PecaEntity peca = pecaDAO.buscarPorId(id_peca);

		// Setar a peça.
		demandaPeca.setPeca(peca);
		
		// Setar a quantidade de peças.
		demandaPeca.setNu_quat_pecas(nu_quat_pecas);
		
		// Setar o preço da peças.
		demandaPeca.setNu_preco(nu_preco);
		
		//Buscar valor total da OS
		float nu_valor_total = ordemServico.getNu_valor_total();
		
		//Atualiza valor total da OS
		nu_valor_total += (nu_preco * nu_quat_pecas);
		
		//Setar valor total atualizado
		ordemServico.setNu_valor_total(nu_valor_total);
		
		// Setar demanda peças.
		ordemServico.addDemandaPeca(demandaPeca);
		
		// Setar demanda de pecas no output da action via ajax
		ajax(ordemServico.getDemandaPecas());
		
		return SUCCESS;
	}

}
